/*****************************************************************************/
/*                                                                           */
/*    Domino Operation System Driver Module                                  */
/*                                                                           */
/*    Copyright (C) 2005 Laszlo Arvai                                        */
/*                                                                           */
/*    ------------------------------------------------------------------     */
/*    drvSystemTimer.c - System Timer (1ms)  Driver                          */
/*****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// Includes
#include <plib.h>
#include <krnlTypes.h>
#include <krnlSystemTimer.h>
#include "drvIOConfig.h"

// Calculate clock rate for the 1ms (1000 interrupts/second)
#define CORE_TICK_RATE       ((sysCLOCK_FREQUENCY / 2) / (krnlSYSTEM_TIMER_TICKS_PER_SECOND))

///////////////////////////////////////////////////////////////////////////////
// Module local variables
static volatile dosWord l_system_time = 0;

///////////////////////////////////////////////////////////////////////////////
// Initialize system timer
void krnlInitSystemTimer(void)
{
 // Open Core Timer
  OpenCoreTimer(CORE_TICK_RATE);

  // set up the core timer interrupt with a prioirty of 2 and zero sub-priority
  mConfigIntCoreTimer((CT_INT_ON | CT_INT_PRIOR_2 | CT_INT_SUB_PRIOR_0));
}

///////////////////////////////////////////////////////////////////////////////
// Interrupt handler
void __ISR(_CORE_TIMER_VECTOR, ipl2) CoreTimerHandler(void)
{
  // clear the interrupt flag
  mCTClearIntFlag();
  
  // update the period
	UpdateCoreTimer(CORE_TICK_RATE);

  // increment TickCount
  l_system_time++;       
}

void krnlIncrementSystemTimer(dosWord in_increment)
{
  // increment TickCount
  l_system_time += in_increment;
}

///////////////////////////////////////////////////////////////////////////////
// Get system timer
dosWord krnlGetSystemTimer(void)
{
	return l_system_time;
}
